package JavaBaseGrammar;

import java.util.Arrays;



public class Array {
    //TODO 二维数组
    public static void main(String[] args) {
        //定义
        int[][] array = {{1,2,3},{4,5,6}};//2行3列
        int[][] array2 = new int[][]{{1,2,3},{3,4,5}};
        int[][] array3 = new int[2][];//可以不写列
        System.out.println(array3[0]);
        array3[0] = new int[]{1,2};
        array3[1] = new int[]{3,4,5};
        System.out.println(array3[0]);
        System.out.println("行" + array.length);
        System.out.println("列" + array[0].length);//每个行下表存的就是一维数组的地址
        //遍历
        for(int i = 0;i < array.length;i++) {
            for (int j = 0;j <array[0].length;j++) {
                System.out.print(array[i][j] + " ");
            }
        }
        //二维数组的打印
        System.out.println(Arrays.deepToString(array));
        for(int[] temp : array){
            for (int x : temp) {
                System.out.print(x+" ");
            }
            System.out.println();
        }

    }
    //TODO 数组的拷贝
    public static void main12(String[] args) {
        int[] array = {1,2,3,4};
        int[] array1 = Arrays.copyOf(array,array.length*2);//二倍扩容
        System.out.println(Arrays.toString(array1));
        //区间拷贝
        int[] copy = Arrays.copyOfRange(array,0,3);//新造了一个数组
        System.out.println(Arrays.toString(copy));
    }
    public static void main11(String[] args) {
        //TODO 判断俩个数组的内容一样不

        int[] array1 = {1,2,3,4};
        int[] array2 = {1,2,3,4};
        System.out.println(Arrays.equals(array1, array2));//返回值是boolen
        //TODO 填充数字
        int[] array = new int[10];
        Arrays.fill(array,0,3,8);//[0,3)这个玩意就是部分填充
        System.out.println(Arrays.toString(array));
    }

    //TODO 二分查找(保证是有序的情况)
    public static int binarySearch(int[] array,int key) {
        int i = 0;
        int j = array.length -1;
        while (i <= j) {
            int mid = (i+j)/2;
            //如果mid下标的值小于key则是右半区
            if(array[mid] < key) {
                i = mid + 1;
                //如果相等,说明找到了
            }else if(array[mid] == key) {
                return mid;
            }else {//不然就是左半区域
                j = mid - 1;
            }
        }
        return -1;//没有找到
    }

    public static void main10(String[] args) {
        int[] array = {1,2,5,8,9,44,90};
//        System.out.println(binarySearch(array, 9));
        //TODO 在Arrays工具类里面也有一个binarySearch
        System.out.println(Arrays.binarySearch(array, 90));

    }

    //TODO 汉诺塔
    public static void move(char pose1,char pose2) {
        System.out.print(pose1+ "=>" + pose2+" ");
    }
    public static void hanio(int n,char pose1,char pose2,char pose3){
      //n盘子数目,pose1 起始位置,Pose2 中转位置, pose3目的地位置
        if(n == 1) {
            move(pose1,pose3);
            return;
        }
        //先借助pose3把n-1个盘子移到pose2上
        hanio(n-1,pose1,pose3,pose2);
        //此时pose1只有一个了,则直接移到pose3上
        move(pose1,pose3);
        //把pose2剩下的借助pose1移到pose3上
        hanio(n-1,pose2,pose1,pose3);
    }

    public static void main9(String[] args) {
        hanio(3,'A','B','C');
    }
    //TODO 冒泡排序
    public static void bubbleSort(int[] array) {
        //i代表趟数
        for(int i = 0 ; i < array.length - 1; i++) {
            //每次比上一次的少一次
            boolean flag = false;//如果没有交换则说明已经排好序了
            for (int j = 0 ; j < array.length - 1 - i ;j++){
                if(array[j] > array [j+1]) {
                    int tep = array[j];
                    array[j] = array[j+1];
                    array[j+1] = tep;
                    flag = true;
                }
                if(flag == false) {
                    return ;
                }
            }
        }
    }

    public static void main8(String[] args) {
        int[] array = {31,23,3,4,34};
        bubbleSort(array);
        System.out.println(Arrays.toString(array));
    }


    //TODO 把数组作为字符串的形式进行输出
    public static void main7(String[] args) {
        int[] array = {31,23,3,4,34};
        System.out.println(Arrays.toString(array));
        //TODO 数组排序
        //区间排序
        Arrays.sort(array,0,2);//[0,2)
        System.out.println(Arrays.toString(array));

        Arrays.sort(array);
        System.out.println(Arrays.toString(array));



    }
    //TODO 数组作为参数返回
    public static int[] func3() {
        int[] ret = new int[2];
        ret[0] = 99;
        ret[1] = 100;
        return ret;
    }
    public static void main6(String[] args) {
        int[] ret = func3();
        for (int i = 0; i < ret.length; i++) {
            System.out.print(ret[i]);
        }

        }

    public static void main2(String[] args) {
        //数组是引用类型
        int[] arr = null;
        System.out.println(arr);
        //TODO 数组的遍历
        int[] a1 = {1,2,3,4};
        for(int x : a1) {//遍历这个数组的时候,把数组的元素赋值给x,并进行打印
            System.out.print(x + " ");
        }
        for (int i = 0; i < a1.length;i++){
            System.out.print(a1[i] + " ");
        }
    }
    public static void main1(String[] args) {
        //TODO 创建数组的三个方式
        int[] array = {1,2,3,4};
        int[] array1 = new int[]{12,34};
        //new是一个关键字 一般用来new对象,数组就是一个对象
        //数组
        int[] array2 = new int[10];//分配了一个大小为10的内存,里面没初始化的话,默认里面的值是0
        System.out.println(array[0]);
        System.out.println(array[1]);
        System.out.println(array[2]);
        System.out.println(array[3]);
//        System.out.println(array[-1]);//数组下标越界异常
        //TODO 求数组长度 数组名.length
        System.out.println(array.length);
        //可以自定义数组长度
        int n = 10;
        int[] a1 = new int[n];

    }
}
